/* 容器适配器---》设计模式有适配器模式
 * 1、适配器底层没有自己的数据结构，它是另一个容器的封装，它的方法全部由底层依赖的容器进行实现的。
 * 2、没有实现自己的迭代器
 *
 * stack: push入栈  pop出栈  top获取栈顶元素  empty判断栈空  size返回元素个数
 * queue: push入队  pop出队  front查看队头元素  back查看队尾元素  empty判断栈空  size返回元素个数
 *
 * stack和queue底层都是依赖deque，为什么不是依赖vector？
 * 答：1、vector的初始内存使用效率太低了，没有deque好
 *    2、对于queue来说，需要支持尾部插入，头部删除，O(1) 如果queue依赖vector，其出队效率很低
 *    3、vector需要大片的连续内存，而deque只需要分段的内存，当存储大量数据时，显然deque对于内存的利用率更好
 *
 * priority_queue: push入队  pop出队  top获取队顶元素  empty判断栈空  size返回元素个数
 * priority_queue底层是依赖于vector，为什么？
 * 答：底层默认把数据组成一个大根堆结构  在一个内存连续的数组上构建一个大根堆或小根堆的
 * */
 
#include <iostream>
#include <deque>
#include <stack>
#include <queue>
using namespace std;

template<typename T,typename Container=deque<T>>
class myStack{
public:
    void push(const T &val){
        con.push_back(val);
    }
    void pop(){
        con.pop_back();
    }
    T top(){
        return con.back();
    }
private:
    Container con;

};

int main(){
    /*
    stack<int> s1;
    for (int i = 0; i < 10; ++i) {
        s1.push(rand()%100+1);
    }
    cout<<s1.size()<<endl;

    while (!s1.empty()){
        cout<<s1.top()<<" ";
        s1.pop();
    }
    */

    /*
    queue<int> q1;
    for (int i = 0; i < 10; ++i) {
        q1.push(rand()%100+1);
    }
    cout<<q1.size()<<endl;

    while (!q1.empty()){
        cout<<q1.front()<<" ";
        q1.pop();
    }
    */

    priority_queue<int> pq;
    for (int i = 0; i < 10; ++i) {
        pq.push(rand()%100+1);
    }
    cout<<pq.size()<<endl;

    while (!pq.empty()){
        cout<<pq.top()<<" ";
        pq.pop();
    }
    return 0;
}